﻿using LHC_Data;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using MockUtil;

namespace LHC_DataTest
{
	/// <summary>
	///This is a test class for DataUtilTest and is intended
	///to contain all DataUtilTest Unit Tests
	///</summary>
	[TestClass()]
	public class LuizDataUtilTest
	{
		#region Configurações Iniciais
		private TestContext testContextInstance;

		/// <summary>
		///Gets or sets the test context which provides
		///information about and functionality for the current test run.
		///</summary>
		public TestContext TestContext
		{
			get
			{
				return testContextInstance;
			}
			set
			{
				testContextInstance = value;
			}
		}

		#endregion

		#region Additional test attributes
		// 
		//You can use the following additional attributes as you write your tests:
		//
		//Use ClassInitialize to run code before running the first test in the class
		//[ClassInitialize()]
		//public static void MyClassInitialize(TestContext testContext)
		//{
		//}
		//
		//Use ClassCleanup to run code after all tests in a class have run
		//[ClassCleanup()]
		//public static void MyClassCleanup()
		//{
		//}
		//
		//Use TestInitialize to run code before running each test
		//[TestInitialize()]
		//public void MyTestInitialize()
		//{
		//}
		//
		//Use TestCleanup to run code after each test has run
		//[TestCleanup()]
		//public void MyTestCleanup()
		//{
		//}
		//
		#endregion

		#region Testes Negociais
		/// <summary>
		///A test for RetornaUltimos5DiasUteis
		///</summary>
		[TestMethod()]
		public void Deve_Retornar_Lista_Com_Os_5_Ultimos_Dias_Uteis_Quando_Data_Inicial_For_27_02_2012()
		{
			DataUtil target = new DataUtil();
			DateTime dataInicial = new DateTime( 2012, 02, 27 );
			List<DateTime> expected = MockData.RetornarListaCom5UltimosDiasUteisParaData_27_02_2012();
			List<DateTime> actual = target.RetornarUltimos5DiasUteis( dataInicial );
			Assert.AreEqual( actual[ 0 ], expected[ 0 ] );
			Assert.AreEqual( actual[ 1 ], expected[ 1 ] );
			Assert.AreEqual( actual[ 2 ], expected[ 2 ] );
			Assert.AreEqual( actual[ 3 ], expected[ 3 ] );
			Assert.AreEqual( actual[ 4 ], expected[ 4 ] );
		}

		[TestMethod()]
		public void Deve_Retornar_Lista_Com_Os_5_Ultimos_Dias_Uteis_Quando_Data_Inicial_For_07_03_2012()
		{
			DataUtil target = new DataUtil();
			DateTime dataInicial = new DateTime( 2012, 03, 07 );
			List<DateTime> expected = MockData.RetornarListaCom5UltimosDiasUteisParaData_07_03_2012();
			List<DateTime> actual = target.RetornarUltimos5DiasUteis( dataInicial );

			Assert.AreEqual( actual[ 0 ], expected[ 0 ] );
			Assert.AreEqual( actual[ 1 ], expected[ 1 ] );
			Assert.AreEqual( actual[ 2 ], expected[ 2 ] );
			Assert.AreEqual( actual[ 3 ], expected[ 3 ] );
			Assert.AreEqual( actual[ 4 ], expected[ 4 ] );
		}

		// 1) Retornar os últimos 7 Dias úteis
		[TestMethod()]
		public void Deve_Retornar_Lista_Com_Os_7_Ultimos_Dias_Uteis_Quando_Data_Inicial_For_27_02_2012()
		{
			DataUtil target = new DataUtil();
			DateTime dataInicial = new DateTime( 2012, 02, 27 );
			List<DateTime> expected = MockData.RetornarListaCom7UltimosDiasUteisParaData_27_02_2012();
			List<DateTime> actual = target.RetornarUltimos7DiasUteis( dataInicial );
			Assert.AreEqual( actual[ 0 ], expected[ 0 ] );
			Assert.AreEqual( actual[ 1 ], expected[ 1 ] );
			Assert.AreEqual( actual[ 2 ], expected[ 2 ] );
			Assert.AreEqual( actual[ 3 ], expected[ 3 ] );
			Assert.AreEqual( actual[ 4 ], expected[ 4 ] );
			Assert.AreEqual( actual[ 5 ], expected[ 5 ] );
			Assert.AreEqual( actual[ 6 ], expected[ 6 ] );
		}

		// 2) Retornar o último dia útil 
		[TestMethod()]
		public void Deve_Retornar_O_Ultimo_Dia_Util_Quando_Data_Inicial_For_27_02_2012()
		{
			DataUtil target = new DataUtil();
			DateTime dataInicial = new DateTime( 2012, 02, 27 );
			DateTime expected = MockData.RetornarUltimoDiaUltilParaData_27_02_2012();
			DateTime actual = target.RetornarUltimoDiaUtil( dataInicial );
			Assert.AreEqual( expected, actual );
		}

		// 3) Retornar os últimos 5 dias corridos
		[TestMethod()]
		public void Deve_Retornar_Os_Ultimos_5_Dias_Corridos_Quando_Data_Inicial_For_27_02_2012()
		{
			DataUtil target = new DataUtil();
			DateTime dataInicial = new DateTime( 2012, 02, 27 );
			List<DateTime> expected = MockData.RetornarListaCom5UltimosDiasCorridosParaData_27_02_2012();
			List<DateTime> actual = target.RetornarUltimos5DiasCorridos( dataInicial );
			Assert.AreEqual( actual[ 0 ], expected[ 0 ] );
			Assert.AreEqual( actual[ 1 ], expected[ 1 ] );
			Assert.AreEqual( actual[ 2 ], expected[ 2 ] );
			Assert.AreEqual( actual[ 3 ], expected[ 3 ] );
			Assert.AreEqual( actual[ 4 ], expected[ 4 ] );
		}

		// 4) Retornar os últimos 7 dias corridos
		[TestMethod()]
		public void Deve_Retornar_Os_Ultimos_7_Dias_Corridos_Quando_Data_Inicial_For_27_02_2012()
		{
			DataUtil target = new DataUtil();
			DateTime dataInicial = new DateTime( 2012, 02, 27 );
			List<DateTime> expected = MockData.RetornarListaCom7UltimosDiasCorridosParaData_27_02_2012();
			List<DateTime> actual = target.RetornarUltimos7DiasCorridos( dataInicial );
			Assert.AreEqual( actual[ 0 ], expected[ 0 ] );
			Assert.AreEqual( actual[ 1 ], expected[ 1 ] );
			Assert.AreEqual( actual[ 2 ], expected[ 2 ] );
			Assert.AreEqual( actual[ 3 ], expected[ 3 ] );
			Assert.AreEqual( actual[ 4 ], expected[ 4 ] );
			Assert.AreEqual( actual[ 5 ], expected[ 5 ] );
			Assert.AreEqual( actual[ 6 ], expected[ 6 ] );
		}

		// 5) Retornar os últimos 30 dias corridos 
		[TestMethod()]
		public void Deve_Retornar_Os_Ultimos_30_Dias_Corridos_Quando_Data_Inicial_For_27_02_2012()
		{
			DataUtil target = new DataUtil();
			DateTime dataInicial = new DateTime( 2012, 02, 27 );
			List<DateTime> expected = MockData.RetornarListaCom30UltimosDiasCorridosParaData_27_02_2012();
			List<DateTime> actual = target.RetornarUltimos30DiasCorridos( dataInicial );
			Assert.AreEqual( actual[ 0 ], expected[ 0 ] );
			Assert.AreEqual( actual[ 1 ], expected[ 1 ] );
			Assert.AreEqual( actual[ 2 ], expected[ 2 ] );
			Assert.AreEqual( actual[ 3 ], expected[ 3 ] );
			Assert.AreEqual( actual[ 4 ], expected[ 4 ] );
			Assert.AreEqual( actual[ 5 ], expected[ 5 ] );
			Assert.AreEqual( actual[ 6 ], expected[ 6 ] );
			Assert.AreEqual( actual[ 7 ], expected[ 7 ] );
			Assert.AreEqual( actual[ 8 ], expected[ 8 ] );
			Assert.AreEqual( actual[ 9 ], expected[ 9 ] );
			Assert.AreEqual( actual[ 10 ], expected[ 10 ] );
			Assert.AreEqual( actual[ 11 ], expected[ 11 ] );
			Assert.AreEqual( actual[ 12 ], expected[ 12 ] );
			Assert.AreEqual( actual[ 13 ], expected[ 13 ] );
			Assert.AreEqual( actual[ 14 ], expected[ 14 ] );
			Assert.AreEqual( actual[ 15 ], expected[ 15 ] );
			Assert.AreEqual( actual[ 16 ], expected[ 16 ] );
			Assert.AreEqual( actual[ 17 ], expected[ 17 ] );
			Assert.AreEqual( actual[ 18 ], expected[ 18 ] );
			Assert.AreEqual( actual[ 19 ], expected[ 19 ] );
			Assert.AreEqual( actual[ 20 ], expected[ 20 ] );
			Assert.AreEqual( actual[ 21 ], expected[ 21 ] );
			Assert.AreEqual( actual[ 22 ], expected[ 22 ] );
			Assert.AreEqual( actual[ 23 ], expected[ 23 ] );
			Assert.AreEqual( actual[ 24 ], expected[ 24 ] );
			Assert.AreEqual( actual[ 25 ], expected[ 25 ] );
			Assert.AreEqual( actual[ 26 ], expected[ 26 ] );
			Assert.AreEqual( actual[ 27 ], expected[ 27 ] );
			Assert.AreEqual( actual[ 28 ], expected[ 28 ] );
			Assert.AreEqual( actual[ 29 ], expected[ 29 ] );
		}

		// 7) Verificar se uma Data é Dia Útil
		[TestMethod()]
		public void Deve_Retornar_TRUE_Quando_A_Data_Passada_For_Dia_Util_Data_Inicial_27_02_2012()
		{
			DataUtil target = new DataUtil();
			DateTime dataInicial = new DateTime( 2012, 02, 27 );
			bool expected = true;
			bool actual = target.VerificaSeEDiaUtil( dataInicial );
			Assert.AreEqual( expected, actual );
		}

		// 8) Verificar se uma Data é Feriado
		[TestMethod()]
		public void Deve_Retornar_FALSE_Quando_A_Data_Passada_Nao_For_Feriado_Data_Inicial_27_02_2012()
		{
			DataUtil target = new DataUtil();
			DateTime dataInicial = new DateTime( 2012, 02, 27 );
			bool expected = false;
			bool actual = target.VerificaSeEFeriado( dataInicial );
			Assert.AreEqual( expected, actual );
		}

		#endregion

		/*
			6) Validar a Data que está sendo passada lançando uma exception com a mensagem apropriada. Para o nosso exemplo uma data é válida se estiver dentro do ano 2012:
		  
		 
			a) Retornar os últimos 7 Dias úteis
				   Exception: throw new Exception("A data informada não é válida, por isso não foi possível retornar os últimos 7 dias úteis.")
		 */
		[TestMethod()]
		public void Deve_Lancar_Exception_Ao_Retornar_Os_Ultimos_7_Dias_Uteis()
		{
			try
			{
				DataUtil target = new DataUtil();
				DateTime dataInicial = new DateTime( 2010, 02, 27 );
				target.RetornarUltimos7DiasUteis( dataInicial );
				Assert.Fail();
			}
			catch( Exception ex )
			{
				Assert.IsTrue( ex.Message.Equals( "A data informada não é válida, por isso não foi possível retornar os últimos 7 dias úteis." ) );
			}
		}

		/*
		    b) Retornar o último dia útil 
				 Exception: throw new Exception("Data inválida.")
		 */
		[TestMethod()]
		public void Deve_Lancar_Exception_Ao_Retornar_Ultimo_Dia_Util()
		{
			try
			{
				DataUtil target = new DataUtil();
				DateTime dataInicial = new DateTime( 2010, 02, 27 );
				target.RetornarUltimoDiaUtil( dataInicial );
				Assert.Fail();
			}
			catch( Exception ex )
			{
				Assert.IsTrue( ex.Message.Equals( "Data inválida." ) );
			}
		}

		/*
			c) Retornar os últimos 5 dias corridos 
			Exception: throw new Exception("Não foi possivel os últimos 5 dias corridos, favor informar uma data válida")
		*/
		[TestMethod()]
		public void Deve_Lancar_Exception_Ao_Retornar_Ultimos_5_Dias_Corridos()
		{
			try
			{
				DataUtil target = new DataUtil();
				DateTime dataInicial = new DateTime( 2010, 02, 27 );
				target.RetornarUltimos5DiasCorridos( dataInicial );
				Assert.Fail();
			}
			catch( Exception ex )
			{
				Assert.IsTrue( ex.Message.Equals( "Não foi possivel os últimos 5 dias corridos, favor informar uma data válida" ) );
			}
		}

		/*
			d) Retornar os últimos 7 dias corridos	
			Exception: throw new Exception("Favor informar uma data válida")
		*/
		[TestMethod()]
		public void Deve_Lancar_Exception_Ao_Retornar_Ultimos_7_Dias_Corridos()
		{
			try
			{
				DataUtil target = new DataUtil();
				DateTime dataInicial = new DateTime( 2010, 02, 27 );
				target.RetornarUltimos7DiasCorridos( dataInicial );
				Assert.Fail();
			}
			catch( Exception ex )
			{
				Assert.IsTrue( ex.Message.Equals( "Favor informar uma data válida" ) );
			}
		}

		/*
			e) Retornar os últimos 30 dias corridos
			Exception: throw new Exception("Impossível recuperar os últimos 30 dias a partir de uma data inválida.")
		 */
		[TestMethod()]
		public void Deve_Lancar_Exception_Ao_Retornar_Ultimos_30_Dias_Corridos()
		{
			try
			{
				DataUtil target = new DataUtil();
				DateTime dataInicial = new DateTime( 2010, 02, 27 );
				target.RetornarUltimos30DiasCorridos( dataInicial );
				Assert.Fail();
			}
			catch( Exception ex )
			{
				Assert.IsTrue( ex.Message.Equals( "Impossível recuperar os últimos 30 dias a partir de uma data inválida." ) );
			}
		}

		#region Testes Utilizados para Desenvolver a Funcionalidade
		/// <summary>
		///A test for RetornarUltimoDia
		///</summary>
		[TestMethod()]
		public void Deve_Retornar_Ultimo_Dia()
		{
			DataUtil target = new DataUtil();
			DateTime data = new DateTime( 2012, 02, 27 );
			DateTime expected = new DateTime( 2012, 02, 26 );
			DateTime actual = target.RetornarUltimoDia( data );
			Assert.AreEqual( expected, actual );
		}

		/// <summary>
		///A test for VerificaSeEDiaUtil
		///</summary>
		[TestMethod()]
		public void Deve_Retornar_True_Quando_Passar_O_Dia_Util_01_03_2012()
		{
			DataUtil target = new DataUtil();
			DateTime data = new DateTime( 2012, 03, 01 );
			bool expected = true;
			bool actual = target.VerificaSeEDiaUtil( data );
			Assert.AreEqual( expected, actual );
		}

		[TestMethod()]
		public void Deve_Retornar_False_Quando_Passar_O_Dia_Util_03_03_2012()
		{
			DataUtil target = new DataUtil();
			DateTime data = new DateTime( 2012, 03, 03 ); // Sábado
			bool expected = false;
			bool actual = target.VerificaSeEDiaUtil( data );
			Assert.AreEqual( expected, actual );
		}

		[TestMethod()]
		public void Deve_Retornar_False_Quando_Passar_O_Dia_Util_04_03_2012()
		{
			DataUtil target = new DataUtil();
			DateTime data = new DateTime( 2012, 03, 04 ); // Domingo
			bool expected = false;
			bool actual = target.VerificaSeEDiaUtil( data );
			Assert.AreEqual( expected, actual );
		}

		/// <summary>
		///A test for VerificaSeEFeriado
		///</summary>
		[TestMethod()]
		public void Deve_Retornar_False_Quando_Data_For_21_02_2012_Feriado_Carnaval()
		{
			DataUtil target = new DataUtil();
			DateTime data = new DateTime( 2012, 02, 22 );
			bool expected = false;
			bool actual = target.VerificaSeEFeriado( data );
			Assert.AreEqual( expected, actual );
		}

		[TestMethod()]
		public void Deve_Retornar_False_Quando_Data_For_03_03_2012()
		{
			DataUtil target = new DataUtil();
			DateTime data = new DateTime( 2012, 03, 03 );
			bool expected = false;
			bool actual = target.VerificaSeEFeriado( data );
			Assert.AreEqual( expected, actual );
		}

		private List<DateTime> retornarFeriados()
		{
			List<DateTime> listaFeriados = new List<DateTime>();
			listaFeriados.Add( new DateTime( 2012, 02, 21 ) );
			return listaFeriados;
		}
		#endregion
	}
}
